傳輸方式主要分四種
上面的三種傳輸方式大同小異
引用方式 & 範例
import { createPublicClient, createWalletClient, http, webSocket, custom } from 'viem'
import { mainnet } from 'viem/chains'
// https
const transport = http('https://eth-mainnet.g.alchemy.com/v2/...')
// webstock
// const transport = webSocket('wss://eth-mainnet.g.alchemy.com/v2/...')
const client = createPublicClient({
chain: mainnet,
transport,
})
// Custom
const clientWallect = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
特別要提一下 http
的 batch
是專屬的屬性,如果設定為 true 將會把下列的請求一當作一次請求
// The below will send a single Batch JSON-RPC HTTP request to the RPC Provider.
const [blockNumber, balance, ensName] = await Promise.all([
client.getBlockNumber(),
client.getBalance({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B' }),
client.getEnsName({ address: '0xd2135CfB216b74109775236E36d4b433F1DF507B' }),
])
這個傳輸方式要特別寫出來因為很特別!!
簡單的來說這一種傳輸方式會以陣列幫你選用目前傳輸正常的傳輸 url
以下是簡單範例
import { createPublicClient, fallback, http } from 'viem'
import { mainnet } from 'viem/chains'
const alchemy = http('https://eth-mainnet.g.alchemy.com/v2/...')
const infura = http('https://mainnet.infura.io/v3/...')
const client = createPublicClient({
chain: mainnet,
transport: fallback([alchemy, infura]),
{ rank: true }
})
// 上面範例如果 alchemy 請求失敗便會,排列infura 使用
其中有一個屬性要說一下 { rank: true }
這個屬性是可以依照你設定的 url 穩定性來調用哪一個 url ,也就是說他會用設定上最穩的的傳輸為優先,算是很實用的方法畢竟我們知道穩定的連線才是我們調用區塊鏈訊息最大的關鍵。
// 屬性解釋
rank: {
interval: 60_000, // 每 60 秒會 ping 設定的傳輸
sampleCount: 5, // 會依據過去 5 次 ping 根據 穩定度&響應速度去排名
timeout: 500, // 傳輸的採樣時間
weights: {
latency: 0.3, // 延遲比重 0.3
stability: 0.7 // 穩定比重 0.7
}
}
希望這個能幫助大家了解。
參考:
https://viem.sh/docs/clients/transports/http.html
https://viem.sh/docs/clients/transports/websocket.html
https://viem.sh/docs/clients/transports/custom.html
https://viem.sh/docs/clients/transports/fallback.html